package com.xy.config;

import com.xy.constants.RabbitConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置，主要是配置队列，如果提前存在该队列，可以省略本配置类
 *
 * @author yangkai.shen
 */
@Slf4j
@Configuration(proxyBeanMethods = false)
public class RabbitMqConfiguration {

	@Bean
	public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
		connectionFactory.setPublisherConfirms(true);
		connectionFactory.setPublisherReturns(true);
		RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
		rabbitTemplate.setMandatory(true);
		rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> log.info("消息发送成功:correlationData({}),ack({}),cause({})", correlationData, ack, cause));
		rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> log.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange, routingKey, replyCode, replyText, message));
		return rabbitTemplate;
	}
	/**
	 * 推送门禁队列
	 */
	@Bean
	public Queue queueRecord() {
		return new Queue(RabbitConstant.TOPIC_RECORD_QUEUE);
	}
	/**
	 * 推送门禁 主题模式队列
	 */
	@Bean
	public TopicExchange topicExchangeRecord() {
		return new TopicExchange(RabbitConstant.TOPIC_RECORD_EXCHANGE);
	}
	/**
	 * 推送门禁
	 * @param topicExchangeRecord
	 */
	@Bean
	public Binding topicBindingRecord(Queue queueRecord, TopicExchange topicExchangeRecord) {
		return BindingBuilder.bind(queueRecord).to(topicExchangeRecord).with(RabbitConstant.TOPIC_RECORD_ROUTING_KEY_ONE);
	}
	/**
	 * 百度人脸注册
	 */
	@Bean
	public Queue queueAddFace() {
		return new Queue(RabbitConstant.TOPIC_ADD_FACE_QUEUE);
	}
	/**
	 * 百度人脸注册 主题模式队列
	 * <li>路由格式必须以 . 分隔，比如 user.email 或者 user.aaa.email</li>
	 * <li>通配符 * ，代表一个占位符，或者说一个单词，比如路由为 user.*，那么 user.email 可以匹配，但是 user.aaa.email 就匹配不了</li>
	 * <li>通配符 # ，代表一个或多个占位符，或者说一个或多个单词，比如路由为 user.#，那么 user.email 可以匹配，user.aaa.email 也可以匹配</li>
	 */
	@Bean
	public TopicExchange topicExchangeAddFace() {
		return new TopicExchange(RabbitConstant.TOPIC_ADD_FACE_EXCHANGE);
	}
	/**
	 * 百度人脸注册 主题模式绑定队列
	 * @param topicExchangeAddFace 主题模式交换器
	 */
	@Bean
	public Binding topicBindingAddFace(Queue queueAddFace, TopicExchange topicExchangeAddFace) {
		return BindingBuilder.bind(queueAddFace).to(topicExchangeAddFace).with(RabbitConstant.TOPIC_ADD_FACE_ROUTING_KEY_ONE);
	}

	/**
	 * 百度人脸修改
	 */
	@Bean
	public Queue queueUpdateFace() {
		return new Queue(RabbitConstant.TOPIC_UPDATE_FACE_QUEUE);
	}
	/**
	 * 百度人脸修改 主题模式队列
	 * <li>路由格式必须以 . 分隔，比如 user.email 或者 user.aaa.email</li>
	 * <li>通配符 * ，代表一个占位符，或者说一个单词，比如路由为 user.*，那么 user.email 可以匹配，但是 user.aaa.email 就匹配不了</li>
	 * <li>通配符 # ，代表一个或多个占位符，或者说一个或多个单词，比如路由为 user.#，那么 user.email 可以匹配，user.aaa.email 也可以匹配</li>
	 */
	@Bean
	public TopicExchange topicExchangeUpdateFace() {
		return new TopicExchange(RabbitConstant.TOPIC_UPDATE_FACE_EXCHANGE);
	}
	/**
	 * 百度人脸修改 主题模式绑定队列
	 * @param topicExchangeUpdateFace 主题模式交换器
	 */
	@Bean
	public Binding topicBindingUpdateFace(Queue queueUpdateFace, TopicExchange topicExchangeUpdateFace) {
		return BindingBuilder.bind(queueUpdateFace).to(topicExchangeUpdateFace).with(RabbitConstant.TOPIC_UPDATE_FACE_ROUTING_KEY_ONE);
	}


	/**
	 * 百度人脸删除
	 */
	@Bean
	public Queue queueDeleteFace() {
		return new Queue(RabbitConstant.TOPIC_DELETE_FACE_QUEUE);
	}
	/**
	 * 百度人脸删除 主题模式队列
	 * <li>路由格式必须以 . 分隔，比如 user.email 或者 user.aaa.email</li>
	 * <li>通配符 * ，代表一个占位符，或者说一个单词，比如路由为 user.*，那么 user.email 可以匹配，但是 user.aaa.email 就匹配不了</li>
	 * <li>通配符 # ，代表一个或多个占位符，或者说一个或多个单词，比如路由为 user.#，那么 user.email 可以匹配，user.aaa.email 也可以匹配</li>
	 */
	@Bean
	public TopicExchange topicExchangeDeleteFace() {
		return new TopicExchange(RabbitConstant.TOPIC_DELETE_FACE_EXCHANGE);
	}
	/**
	 * 百度人脸删除 主题模式绑定队列
	 * @param topicExchangeDeleteFace 主题模式交换器
	 */
	@Bean
	public Binding topicBindingDeleteFace(Queue queueDeleteFace, TopicExchange topicExchangeDeleteFace) {
		return BindingBuilder.bind(queueDeleteFace).to(topicExchangeDeleteFace).with(RabbitConstant.TOPIC_DELETE_FACE_ROUTING_KEY_ONE);
	}


	/**
	 * 百度人脸删除
	 */
	@Bean
	public Queue queueRecordOffLine() {
		return new Queue(RabbitConstant.TOPIC_RECORD_OFF_LINE_QUEUE);
	}
	/**
	 * 百度人脸删除 主题模式队列
	 * <li>路由格式必须以 . 分隔，比如 user.email 或者 user.aaa.email</li>
	 * <li>通配符 * ，代表一个占位符，或者说一个单词，比如路由为 user.*，那么 user.email 可以匹配，但是 user.aaa.email 就匹配不了</li>
	 * <li>通配符 # ，代表一个或多个占位符，或者说一个或多个单词，比如路由为 user.#，那么 user.email 可以匹配，user.aaa.email 也可以匹配</li>
	 */
	@Bean
	public TopicExchange topicExchangeRecordOffLine() {
		return new TopicExchange(RabbitConstant.TOPIC_RECORD_OFF_LINE_EXCHANGE);
	}
	/**
	 * 百度人脸删除 主题模式绑定队列
	 * @param topicExchangeRecordOffLine 主题模式交换器
	 */
	@Bean
	public Binding topicBindingRecordOffLine(Queue queueRecordOffLine, TopicExchange topicExchangeRecordOffLine) {
		return BindingBuilder.bind(queueRecordOffLine).to(topicExchangeRecordOffLine).with(RabbitConstant.TOPIC_RECORD_OFF_LINE_ROUTING_KEY_ONE);
	}


	/**
	 * 腾讯人脸注册
	 */
	@Bean
	public Queue topicTencentAddFaceQueue() {
		return new Queue(RabbitConstant.TOPIC_TENCENT_ADD_FACE_QUEUE);
	}
	/**
	 * 腾讯人脸注册 主题模式队列
	 * <li>路由格式必须以 . 分隔，比如 user.email 或者 user.aaa.email</li>
	 * <li>通配符 * ，代表一个占位符，或者说一个单词，比如路由为 user.*，那么 user.email 可以匹配，但是 user.aaa.email 就匹配不了</li>
	 * <li>通配符 # ，代表一个或多个占位符，或者说一个或多个单词，比如路由为 user.#，那么 user.email 可以匹配，user.aaa.email 也可以匹配</li>
	 */
	@Bean
	public TopicExchange topicTencentAddFaceExchange() {
		return new TopicExchange(RabbitConstant.TOPIC_TENCENT_ADD_FACE_EXCHANGE);
	}
	/**
	 * 腾讯人脸注册 主题模式绑定队列
	 * @param topicTencentAddFaceExchange 主题模式交换器
	 */
	@Bean
	public Binding topBindingicTencentAddFaceExchange(Queue topicTencentAddFaceQueue, TopicExchange topicTencentAddFaceExchange) {
		return BindingBuilder.bind(topicTencentAddFaceQueue).to(topicTencentAddFaceExchange).with(RabbitConstant.TOPIC_TENCENT_ADD_FACE_ROUTING_KEY_ONE);
	}

	/**
	 * 腾讯人脸 删除
	 */
	@Bean
	public Queue topicTencentDeleteFaceQueue() {
		return new Queue(RabbitConstant.TOPIC_TENCENT_DELETE_FACE_QUEUE);
	}
	/**
	 * 腾讯人脸 删除 主题模式队列
	 * <li>路由格式必须以 . 分隔，比如 user.email 或者 user.aaa.email</li>
	 * <li>通配符 * ，代表一个占位符，或者说一个单词，比如路由为 user.*，那么 user.email 可以匹配，但是 user.aaa.email 就匹配不了</li>
	 * <li>通配符 # ，代表一个或多个占位符，或者说一个或多个单词，比如路由为 user.#，那么 user.email 可以匹配，user.aaa.email 也可以匹配</li>
	 */
	@Bean
	public TopicExchange topicTencentDeleteFaceExchange() {
		return new TopicExchange(RabbitConstant.TOPIC_TENCENT_DELETE_FACE_EXCHANGE);
	}
	/**
	 * 腾讯人脸 删除 主题模式绑定队列
	 * @param topicTencentDeleteFaceExchange 主题模式交换器
	 */
	@Bean
	public Binding topicBindingTencentDeleteFaceRoutingKeyOne(Queue topicTencentDeleteFaceQueue, TopicExchange topicTencentDeleteFaceExchange) {
		return BindingBuilder.bind(topicTencentDeleteFaceQueue).to(topicTencentDeleteFaceExchange).with(RabbitConstant.TOPIC_TENCENT_DELETE_FACE_ROUTING_KEY_ONE);
	}
}
